//
// Created by Administrator on 2022/10/22.
//

//队列,相当于排队,是一种先进先出的存储结构,也是一种特殊的线性表
//队列在队头进行出队操作,在队尾进行入队操作

//队列的顺序存储结构使用数组实现,为了提高数组的利用效率,队列实现成循环队列形式
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 5
#define ERROR 0
#define OK 1
typedef int ElementType;
typedef int Status;

typedef struct  {
    ElementType data[MAXSIZE];
    int front; /* 队头指针,在出队操作时,会增加一位 */
    int rear;  /* 队尾指针,在入队操作时,会增加一位 */

} SqQueue ;

//初始化一个队列,此时队列为空状态
void initQueue(SqQueue* queue){
    queue->front=0;
    queue->rear=0;
}

//入队操作,要判断队列是否已满
//队列已满的条件,(rear+1)%maxsize==0
Status EnQueue(SqQueue* queue,ElementType e){
    if((queue->rear+1)%MAXSIZE==queue->front){ //队列已满
        return ERROR;
    }
    queue->data[queue->rear]  =e;
    queue->rear=(queue->rear+1)%MAXSIZE;
    return OK;
}

//出队操作,要判断队列是否为空
//队列为空的条件 rear = front
Status DeQueue(SqQueue* queue,ElementType* e){
    if(queue->front==queue->rear){
        return ERROR;
    }
    *e = queue->data[queue->front];
    queue->front=(queue->front+1)%MAXSIZE;
    return OK;
}
int LengthQueue(SqQueue queue){
    return (queue.rear-queue.front+MAXSIZE)%MAXSIZE;
}
void showQueue(SqQueue queue){
    int index = queue.front;
    for (int i = 0; i < LengthQueue(queue); ++i) {
        printf("%d\n",queue.data[index]);
        index = (index+1)%MAXSIZE;
    }
}

void main(){
    SqQueue queue;
    initQueue(&queue);
    for (int i = 0; i < 6; ++i) {
        EnQueue(&queue,i);
    }
    showQueue(queue);
}
